package com.team.game.Game;


import android.graphics.Path;
import android.graphics.PathMeasure;

import static com.team.game.framework.impl.Scale_X_Y.Scale_X;
import static com.team.game.framework.impl.Scale_X_Y.Scale_Y;


class PathMaker {

    private Path path;
    private float dx, dy;

    public PathMaker() {
        //эти переменные будут дописыватся к каждому значению
        dx = dy = 0;
    }

    public PathMeasure[] makeLevel (int level) {

        Path levelPath[];
        PathMeasure pathMeasure[];
        int num_path;

        switch (level) {
            case 1:
                num_path = 1;
                levelPath = new Path[num_path];
                levelPath[0] = makePath (11, -48, -48);
                break;

            case 2:
                num_path = 3;
                levelPath = new Path[num_path];
                levelPath[0] = makePath (21, -48, -48);
                levelPath[1] = makePath (22, -48, -48);
                levelPath[2] = makePath (23, -48, -48);
                break;
            case 3:
                num_path = 2;
                levelPath = new Path[num_path];
                levelPath[0] = makePath (31, -48, -48);
                levelPath[1] = makePath (32, -48, -48);
                break;
            default:
                throw new RuntimeException ("Levels->PathMaker->MakeLevel | Unknown level");
        }

        pathMeasure = new PathMeasure[num_path];
        for (int i = 0; i < num_path; i++) {
            pathMeasure[i] = new PathMeasure (levelPath[i], false);
        }

        return pathMeasure;
    }


    private Path makePath (int number, float dx, float dy) {

        this.dx = dx;
        this.dy = dy;

        //почему-то не работает :/
        //path.reset();

        path = new Path();

        /*
         * int number: первая цифра - номер уровня (1x - первый уровень, 2x - второй, 3x...)
         *             вторая цифра - номер песа (x1, x2, ..., x10, x11...)
         *
         * float dx: смещение по оси X (здвинуть путь вправо/влево)
         * float dy: смещение по оси Y (вверх/вниз)
         */

        switch (number) { //вносить значения без учета сдвига и скейлинга для 1080на1920
            //case 10:
            //cubicTo (648, 947, 397, 771, 383, 943);
            //cubicTo (421, 1122, 716, 891, 756, 1069);
            //cubicTo (724, 1183, 563, 1086, 563, 1237);
            //quadTo (597, 1760, 451, 1825);
            //break;
            case 11:
                moveTo (555, 0);
                quadTo (430, 151, 227, 222);
                cubicTo (333, 301, 894, 249, 835, 355);
                //-----
                cubicTo ((int) (476 * 1.5), (int) (322 * 1.5), (int) (177 * 1.5), (int) (338 * 1.5), (int) (200 * 1.5), (int) (381 * 1.5));
                cubicTo ((int) (207 * 1.5), (int) (430 * 1.5), (int) (627 * 1.5), (int) (406 * 1.5), (int) (571 * 1.5), (int) (480 * 1.5));
                cubicTo ((int) (506 * 1.5), (int) (590 * 1.5), (int) (304 * 1.5), (int) (506 * 1.5), (int) (341 * 1.5), (int) (606 * 1.5));
                cubicTo ((int) (374 * 1.5), (int) (722 * 1.5), (int) (225 * 1.5), (int) (595 * 1.5), (int) (184 * 1.5), (int) (687 * 1.5));
                cubicTo ((int) (182 * 1.5), (int) (738 * 1.5), (int) (576 * 1.5), (int) (838 * 1.5), (int) (164 * 1.5), (int) (904 * 1.5));
                cubicTo ((int) (106 * 1.5), (int) (912 * 1.5), (int) (333 * 1.5), (int) (993 * 1.5), (int) (368 * 1.5), (int) (1083 * 1.5));
                break;

            case 21:
                moveTo(515, 0);
                lineTo(515, 248);
                cubicTo(408, 479, 949, 506, 742, 696);
                quadTo(646, 683, 648, 771);
                break;
            case 22:
                moveTo(571, 0);
                lineTo(571, 248);
                quadTo(508, 357, 418, 380);
                cubicTo(161, 540, 680, 722, 648, 771);
                break;
            case 23:
                moveTo(1168, 300);
                quadTo(595, 201, 418, 380);
                cubicTo(161, 540, 680, 722, 648, 771);
                break;

            case 31:
                moveTo (550, 0);
                cubicTo (392, 223, 172, 190, 208, 243);
                cubicTo (289, 307, 926, 260, 858, 382);
                cubicTo (757, 482, 268, 480, 329, 602);
                //---------------------------------------------------------
                cubicTo (438, 669, 919, 620, 844, 717); // case 321: quadTo (170, 1022, 524, 987); break;
                cubicTo (703, 898, 440, 756, 524, 987);
                //---------------------------------------------------------
                cubicTo (1022, 1071, 986, 1150, 752, 1169);
                //---------------------------------------------------------
                cubicTo (540, 1260, 953, 1413, 879, 1435);  // case 341: cubicTo (505, 1168, 485, 1339, 319, 1347); cubicTo (25,  1369, 545, 1466, 526, 1682);
                cubicTo (689, 1556, 505, 1405, 526, 1682);
                //---------------------------------------------------------
                lineTo (526, 1919);
                break;
            case 32:
                moveTo (550, 0);
                cubicTo (392, 223, 172, 190, 208, 243);
                cubicTo (289, 307, 926, 260, 858, 382);
                cubicTo (757, 482, 268, 480, 329, 602);
                //---------------------------------------------------------
                quadTo (170, 1022, 524, 987);
                //---------------------------------------------------------
                cubicTo (1022, 1071, 986, 1150, 752, 1169);
                //---------------------------------------------------------
                cubicTo (505, 1168, 485, 1339, 319, 1347);
                cubicTo (25, 1369, 545, 1466, 526, 1682);
                //---------------------------------------------------------
                lineTo (526, 1919);
                break;

            default:
                throw new RuntimeException("Unknown path!");
        }
        if (number == 21 || number == 22 || number == 23) { //пока пусть так, потом что-то придумаю
            cubicTo(648, 947, 397, 771, 383, 943);
            cubicTo(421, 1122, 716, 891, 756, 1069);
            cubicTo(724, 1183, 563, 1086, 563, 1237);
            quadTo(597, 1760, 451, 1825);
        }
        return path;
    }

    /*Используем єти методы чтобы конструктор не превращался в кашу*/

    private void moveTo(int x, int y) {
        path.moveTo((x + dx) * Scale_X, (y + dy) * Scale_Y);
    }

    private void lineTo(int x, int y) {
        path.lineTo((x + dx) * Scale_X, (y + dy) * Scale_Y);
    }

    private void quadTo(int x1, int y1, int x2, int y2) {
        path.quadTo((x1 + dx) * Scale_X, (y1 + dy) * Scale_Y, (x2 + dx) * Scale_X, (y2 + dy) * Scale_Y);
    }

    private void cubicTo(int x1, int y1, int x2, int y2, int x3, int y3) {
        path.cubicTo((x1 + dx) * Scale_X, (y1 + dy) * Scale_Y, (x2 + dx) * Scale_X, (y2 + dy) * Scale_Y, (x3 + dx) * Scale_X, (y3 + dy) * Scale_Y);
    }

//TODO Дописать метод добавления
// по неведомой мне причине едПес не работает ни в какую
//    /*дописывает path2 до path1 */
//    public Path addPath(Path path1, Path path2){
//        path1.addPath (path2);
//        return path1;
//    }
}
